#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

int main(){
  MYSQL *mysql; //用于连接服务器
  MYSQL_RES *result; //接收一个查询返回的结果
  MYSQL_ROW row; //保存一条记录的所有数据 --- mysql_fetch_row()
  MYSQL_FIELD *field; //存储某一列的信息
                     //char *name; 列名 
                     //char* table; 表名 
                     //char* def; 列的缺省值 
                     //enum enum_field_types type; 列的数据类型

  //MySQL连接
  mysql = mysql_init(NULL);
  if(!mysql_real_connect(mysql, "localhost", "root", "1", NULL, 0, NULL, 0)){
    fprintf(stderr, "Failed to connect to database: Error:%s\n", mysql_error(mysql));
    exit(-1);
  }
  //mysql_ping(mysql); //检查连接是否正常工作 0:正常
  
  mysql_set_character_set(mysql, "utf8"); //解决中文乱码问题

  //打印连接信息
  printf("连接信息:%s\n", mysql_get_server_info(mysql));
  printf("主机信息:%s\n", mysql_get_host_info(mysql));

  //选择数据库
  if(mysql_select_db(mysql, "db1")){
    printf("select db wrong:%s\n", mysql_error(mysql));
    exit(-1);
  }


  //执行查询并处理
  mysql_query(mysql, "select * from course"); //参数 const char* query 为一个字符串
  
  //读取查询结果
  result = mysql_store_result(mysql); //读取查询的全部结果, 并分配一个MYSQL_RES结构, 
                                      //把结果放入这个结构中, 如果没有查询结果, 返回空集合
  if(result == NULL){
    printf("Error:%s\n", mysql_error(mysql));
  }
  
  //my_ulonglong mysql_num_rows(MYSQL_RES*); //返回集合中的记录数, 只能用于mysql_store_result                                    

  //mysql_use_result(mysql); //作用同上, 但是把数据留在服务器上, 需要时才会取                                
  
  //field 系列函数 用于处理列信息
  unsigned int num_fields = mysql_field_count(mysql); //返回最近查询结果中列的数目
  //mysql_num_fields(result); //返回结果集合中列的数目

  while(field = mysql_fetch_field(result)){
    printf("No.%d: %s\n", mysql_field_tell(result), field->name);
  }

  while(row = mysql_fetch_row(result)){    //取出结果中下一条记录
    unsigned long *lengths;
    lengths = mysql_fetch_lengths(result); //返回当前记录的长度 以数组格式保存
    for(unsigned int i = 0; i < num_fields; ++i){
      printf("[%d]:%s ", (int)lengths[i], row[i] ? row[i] : "NULL");
    }
    printf("\n");
  }

  //char query[] = "select * from stu";
  //mysql_real_query(mysql, query, strlen(query)); //可以用于二进制数据的查询

  //释放内存
  mysql_free_result(result);
  //关闭连接
  mysql_close(mysql);
}
